#include "Modelo.h"
#include  "Torrent.h"

Modelo::Modelo()
{
	ifstream archivo;

	archivo.open("torrents.txt");

	while (!archivo.eof()) {
		string path;
		string piezas;

		getline(archivo, path);
		getline(archivo, piezas);
	}

	archivo.close();

}

Modelo::~Modelo()
{
	list<Torrent*>::iterator i;
	for (i = this->torrents.begin(); i != this->torrents.end(); i++) {
		delete *i;
	}
}

list<Torrent*>* Modelo::getListaTorrents() {
	return &this->torrents;
}

string Modelo::piecesToStr(list<unsigned long int>* piezasBajadas) {

	string retorno = "";
	list<unsigned long int>::iterator i;
	for (i = piezasBajadas->begin(); i != piezasBajadas->end(); i++) {
		char aux[11];
		sprintf(aux,"%lu",*i);
		retorno += aux;
		retorno += ',';
	}

	// Si no esta vació elimino el ultimo coma
	int tamanio = retorno.size();
	if (tamanio > 0) {
	retorno.erase(tamanio - 1);
	}

	return retorno;
}

list<unsigned long int>* Modelo::strToPieces(const string& piezas) {

	list<unsigned long int>* piezasBajadas = new list<unsigned long int>();

	if (piezas.size() > 0) {
		unsigned long int pieza;
		char* cstr = new char [piezas.size()+1];
		strcpy (cstr, piezas.c_str());
		char* aux = strtok(cstr,",");
		sscanf(aux,"%lu", &pieza);
		piezasBajadas->push_back(pieza);
		while ((aux = strtok(NULL,","))) {
			if (aux) {
				sscanf(aux,"%lu", &pieza);
			}
			piezasBajadas->push_back(pieza);
		}
		delete [] cstr;
	}
	return piezasBajadas;
}

void Modelo::guardarTorrents() {

	remove("torrents.txt");

	ofstream archivo;
	archivo.open("torrents.txt");

	list<Torrent*>::iterator i;

	for (i = this->torrents.begin(); i != this->torrents.end(); i++) {
		string path; // TODO getPath de Torrent
		string piezas = piecesToStr(NULL); // TODO cambiar por getPiezas de Torrent

		archivo << path << "\n" << piezas << "\n";
	}

	archivo.close();
}

void Modelo::pausarTorrent(string id) {
//	list<Torrent*>::iterator i;
//	bool seguir;
//
//	for (i = this->torrents.begin(); i != this->torrents.end() || seguir; i++) {
//		if ((*i)->getId() == id) {
//			(*i)->pausar((*i)->getPausado());
//			seguir = false;
//		}
//	}
}

void Modelo::agregarTorrent(string path) {

//	Torrent* nuevo = new Torrent(path,"",0); // TODO cambiar
//	this->torrents.push_back(nuevo);
}

void Modelo::removerTorrent(string id) {

//	list<Torrent*>::iterator i;
//	bool seguir;
//
//	for (i = this->torrents.begin(); i != this->torrents.end() || seguir; i++) {
//		if ((*i)->getId() == id) {
//			(*i)->remover();
//			seguir = false;
//		}
//	}
}
